/*******************************************************************
 *
 *  ttdebug.h
 *
 *    Debugging and Logging component (specification)
 *
 *  Copyright 1996-1999 by
 *  David Turner, Robert Wilhelm, and Werner Lemberg.
 *
 *  This file is part of the FreeType project, and may only be used
 *  modified and distributed under the terms of the FreeType project
 *  license, LICENSE.TXT.  By continuing to use, modify, or distribute
 *  this file you indicate that you have read the license and
 *  understand and accept it fully.
 *
 *
 *  This component contains various macros and functions used to
 *  ease the debugging of the FreeType engine. Its main purpose
 *  is in assertion checking, tracing, and error detection.
 *
 *  There are now three debugging modes:
 *
 *  - trace mode:
 *
 *       Error and trace messages are sent to the log file
 *       (which can be the standard error output).  Define
 *       DEBUG_LEVEL_TRACE to enable this mode.
 *
 *  - error mode:
 *
 *       Only error messages are generated.  Define
 *       DEBUG_LEVEL_ERROR to enable this mode.
 *
 *  - release mode:
 *
 *       Error messages are neither sent nor generated. The code is
 *       free from any debugging parts.
 *
 ******************************************************************/

#ifndef TTDEBUG_H
#define TTDEBUG_H

#include "ttconfig.h"
#include "tttypes.h"

#ifdef __cplusplus
extern "C" {
#endif

#if defined( DEBUG_LEVEL_TRACE )

	typedef enum Trace_Component_ {
		trace_any = 0,
		trace_api,
		trace_interp,
		trace_load,
		trace_gload,
		trace_memory,
		trace_file,
		trace_mutex,
		trace_cache,
		trace_calc,
		trace_cmap,
		trace_extend,
		trace_objs,
		trace_raster,

		trace_bitmap,
		trace_max
	} Trace_Component;

	/* Here we define an array to hold the trace levels per component. */
	/* Since it is globally defined, all array members are set to 0.   */
	/* You should set the values in this array either in your program  */
	/* or with your debugger.                                          */
	/*                                                                 */
	/* Currently, up to eight levels (PTRACE0-PTRACE7, see below) are  */
	/* used in some parts of the engine.                               */
	/*                                                                 */
	/* For example, to have all tracing messages in the raster         */
	/* component, say                                                  */
	/*                                                                 */
	/*   #define DEBUG_LEVEL_TRACE                                     */
	/*   #include "ttdebug.h"                                          */
	/*                                                                 */
	/*   ...                                                           */
	/*   set_tt_trace_levels( trace_raster, 7 )                        */
	/*                                                                 */
	/* in your code before initializing the FreeType engine.           */
	/*                                                                 */
	/* Maybe it is better to define DEBUG_LEVEL_TRACE in ttconfig.h... */

	extern char tt_trace_levels[trace_max];

	/* IMPORTANT:                                                 */
	/*                                                            */
	/*  Each component must define the macro TT_COMPONENT         */
	/*  to a valid Trace_Component value before using any         */
	/*  PTRACEx macro.                                            */
	/*                                                            */

#define  PTRACE( level, varformat )  \
         if ( tt_trace_levels[TT_COMPONENT] >= level ) TT_Message##varformat

#elif defined( DEBUG_LEVEL_ERROR )

#define  PTRACE( level, varformat )	/* nothing */

#else							/* RELEASE MODE */

#define TT_Assert( condition, action )	/* nothing */

#define PTRACE( level, varformat )	/* nothing */
#define PERROR( varformat )		/* nothing */
#define PANIC( varformat )		/* nothing */

#endif

/************************************************************************/
	/*                                                                      */
	/*  Define macros and fuctions that are common to the debug and trace   */
	/*  modes.                                                              */
	/*                                                                      */

#if defined( DEBUG_LEVEL_TRACE ) || defined( DEBUG_LEVEL_ERROR )

#define TT_Assert( condition, action )  if ( !(condition) ) ( action )

	void TT_Message(const String * fmt, ...);
	void TT_Panic(const String * fmt, ...);
	/* print a message and exit */

	const String *Cur_U_Line(void *exec);

#define PERROR( varformat )  TT_Message##varformat
#define PANIC( varformat )   TT_Panic##varformat

#endif

#if defined( DEBUG_LEVEL_TRACE )

	void set_tt_trace_levels(int index, char value);

#endif

#define  PTRACE0( varformat )  PTRACE( 0, varformat )
#define  PTRACE1( varformat )  PTRACE( 1, varformat )
#define  PTRACE2( varformat )  PTRACE( 2, varformat )
#define  PTRACE3( varformat )  PTRACE( 3, varformat )
#define  PTRACE4( varformat )  PTRACE( 4, varformat )
#define  PTRACE5( varformat )  PTRACE( 5, varformat )
#define  PTRACE6( varformat )  PTRACE( 6, varformat )
#define  PTRACE7( varformat )  PTRACE( 7, varformat )

#ifdef __cplusplus
}
#endif
#endif							/* TTDEBUG_H */
